#ifndef COUNTERTHREAD_H
#define COUNTERTHREAD_H

#include <QObject>
#include <QThread>
#include <atomic>
#include <QWaitCondition>
#include <QMutex>

#include "BlobAnalysis.h"

// 计数结果结构体
struct CountResult
{
    int totalCount;
    int leftCount;
    int rightCount;
};

class CounterThread : public QThread
{
    Q_OBJECT
public:
    explicit CounterThread(QObject *parent = nullptr);
    ~CounterThread();

    // 重置计数
    void resetCounts();
    // 停止线程
    void stopProcessing();
    // 设置统计模式
    void setCountMode(int mode);
    // 设置上限值
    void setLimits(int totalLimit, int leftLimit, int rightLimit);
    // 处理接收到的区域数据
    void onRegionsReceived(const int width, const vector<XVL::XVRegion>& regions);

protected:
    void run() override;

signals:
    // 超过上限信号
    void limitExceeded();
    // 计数更新信号
    void countUpdated(const CountResult& result);

private:
    // 重置停止标志
    void resetstopFlag();
    // 判断线程是否应该停止
    bool shouldStop();
    // 检查并等待是否收到处理线程的信号
    void checkAndWaitReceived();
    // 计算左侧右侧各自的黑色区域数量
    void calcuLeftRightCount(const int width, const vector<XVL::XVRegion>& regions);
    // 检查是否超过上限
    bool checkLimits(int totalCount, int leftCount, int rightCount);

private:
    atomic<bool> stopRequested_;        // 线程停止标志
    atomic<bool> isReceived_;           // 是否收到处理线程发来的信号
    QWaitCondition waitCondition_;      // 等待条件变量
    QMutex mutex_;                      // 互斥锁
    int countMode_;                     // 统计模式
    int totalLimit_;                    // 总数上限
    int leftLimit_;                     // 左侧上限
    int rightLimit_;                    // 右侧上限
    int totalCount_;                    // 当前总数
    int leftCount_;                     // 当前左侧数
    int rightCount_;                    // 当前右侧数
};

#endif // COUNTERTHREAD_H
